// src/middleware/errorHandler.js
const Response = require('../utils/response');

async function errorHandler(ctx, next) {
  try {
    await next();

    // 处理404
    if (ctx.status === 404 && !ctx.body) {
      ctx.app.emit('error', new Error('资源未找到'), ctx);
    }
  } catch (err) {
    // 记录错误日志
    switch (err.name) {
      case 'ValidationError': // 参数验证失败
        return Response.error(ctx, '参数验证失败', 400, err.errors);
      case 'UnauthorizedError': // jwt token验证失败
        return Response.error(ctx, 'token验证失败', 401, err.errors);
      case 'TokenExpiredError': // jwt token过期
        return Response.error(ctx, 'token已过期', 401, err.errors);
      case 'JsonWebTokenError': // jwt token无效
        return Response.error(ctx, 'token无效', 401, err.errors);
      case 'SequelizeUniqueConstraintError': // 数据库唯一索引冲突
        return Response.error(ctx, '数据库唯一索引冲突', 500, err.errors);
      default:
        Response.error(ctx, err.message || '服务器内部错误', err.status || 500, err.errors);

    }
    // 触发全局错误事件
    ctx.app.emit('error', err, ctx);
  }
}

module.exports = errorHandler;